class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        //num[2,3,1,2,4,3]    前缀和[0,2,5,6,8,12,15](前一个数的和，前两个数的和。。。)  taraget=7
        //从num[0]开始找，在前缀数组中找>=target的第一个数字（用二分查找） 找到了8,index=4，因此从num[0]最短是4
        //在从num[1]找，在前缀数组中找>=(target+num[0])的第一个数字，找到了12,index=5，去掉 num[0]，因此从num[1]最短是4
        //按照上述依次寻找，完了记得去掉前缀
        int l = nums.length;
        int[] sum = new int[l+1];
        for(int i = 0;i < l;i++) {
            sum[i+1] = sum[i] + nums[i];
        }
        int result = l + 1;//结果，如何初始值为0，在取小时无法判断
        for(int i = 0;i < l ;i++) {
            int find = target + sum[i];
            //binarySearch(数组，数字)(所有的数组类型,目标)使用二叉搜索算法搜索指定的int数组的指定值。 
            //要搜索的目标比搜索范围的数字都大：返回：(上限实际下标+1)的负值
            //要搜索的目标比搜索范围的数字都小，返回：(下限下标+1)的负值
            int xiabiao = Arrays.binarySearch(sum,find);
            if(xiabiao < 0) {
                xiabiao = -xiabiao -1;
            }
            if(xiabiao <= l) {
                result = Math.min(result,xiabiao - i);
            }
        }
        return result == nums.length + 1 ? 0 : result;//防止在数组中没有找到，而返回result的初始值
    }
}